package com.itheima.dubbo.service;

import com.itheima.dubbo.User;
import com.itheima.dubbo.UserFace;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.config.annotation.Method;
import org.apache.dubbo.rpc.RpcContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

/**
 * @Description:
 * @Version: V1.0
 */

// 注册服务使用
//@DubboService
// 0：不重试 默认是2，重试2次，不包含第一次的调用
// 冪等性：无论发送多少次相同的请求，结果是一致的！
// GET  DELETE  PUT（表单发起修改 冪等）  POST（非冪等）
// 结论：dubbo的远程调用过程中，对于非冪等操作，建议设置重试次数0，冪等性操作也建议重试次数不要过多，最好默认
// retries 重试次数
//@DubboService(retries = 2)
// 超时时间 注解优于配置 消费者优于提供者
//@DubboService(timeout = 2000)
// 方法级别
//@DubboService(methods = {
//        @Method(name = "findById",timeout = 10, retries = 0),
//        @Method(name = "hello",timeout = 1000),
//})
//@DubboService(version = "${dubbo.application.version}")
@DubboService( weight = 200) // 设置权重
@Slf4j
public class UserFaceImpl implements UserFace {

    @Override
    public String hello(String username) {
        log.info("username = " + username);
//        int i = 1 / 0;
        return "Hello Dubbo username：" + username;
    }


    @Value("${server.port}")
    private Integer port;

    @Override
    public User findById(User user) {

        log.info("findById ...." + port);
//        try {
//            Thread.sleep(3000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

//        RpcContext context = RpcContext.getContext();
//        String it = context.getAttachment("it");
        // 本端是否为提供端，这里会返回true
        boolean isProviderSide = RpcContext.getContext().isProviderSide();
        log.info("isProviderSide: " + isProviderSide);
        // 获取调用方IP地址
        String clientIP = RpcContext.getContext().getRemoteHost();
        log.info("clientIP: " + clientIP);
        // 获取当前服务配置信息，所有配置信息都将转换为URL的参数
        String application = RpcContext.getContext().getUrl().getParameter("application");
        log.info("application: " + application);
        // 注意：每发起RPC调用，上下文状态会变化
        // 此时本端变成消费端，这里会返回false

        String it = RpcContext.getContext().getAttachment("it");
        log.info(it);
        return new User(user.getId(),user.getName()+"-itheima");
    }
}
